// logger.cpp
#include "log/log.h"
#include <memory>
Logger::Logger():m_bInit(false){
}
Logger::~Logger(){
    if(m_bInit){
        UnInit();
    }
}
void Logger::Init(const LogConfig& conf) {

    if(m_bInit){
        printf("It's already initialized\n");
    }
    m_bInit = true;
    try{
        //自定义的sink，日志的名字是file_logger
        //自定义的sink，日志的名字是file_logger
        auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();

        consoleSink->set_level(spdlog::level::from_str(conf.level));

        auto fileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(conf.path.c_str(), conf.size, conf.count);
        fileSink->set_level(spdlog::level::trace);
       // fileSink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [thread %t] [%s %!:%#] %v");
        fileSink->set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
        //    //设置格式
        //    //参见文档 https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
        //    //[%Y-%m-%d %H:%M:%S.%e] 时间
        //    //[%l] 日志级别
        //    //[%t] 线程
        //    //[%s] 文件
        //    //[%#] 行号
        //    //[%!] 函数
        //    //[%v] 实际文本
        //    loggerPtr->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [thread %t] [%s %!:%#] %v");

        /*Sink  组合*/
        std::vector<spdlog::sink_ptr> sinks;
        sinks.push_back(consoleSink);
        sinks.push_back(fileSink);

        //设置异步
        spdlog::init_thread_pool(102400, 1);
        auto tp = spdlog::thread_pool();
        loggerPtr =  std::make_shared<spdlog::async_logger>(" ", begin(sinks), end(sinks), tp, spdlog::async_overflow_policy::block);
        printf(" Spdlog create success");
    }catch(const spdlog::spdlog_ex& ex){
        printf("Splog init error {%s}", ex.what());
    }

}

/*
 * trace 0
 * debug 1
 * info 2
 * warn 3
 * error 4
 * critical 5
 * off 6 (not use)
 */
std::string Logger::GetLogLevel() {
    auto level = loggerPtr->level();
    return spdlog::level::to_string_view(level).data();
}

void Logger::SetLogLevel(const std::string& log_level) {
    auto level = spdlog::level::from_str(log_level);
    if (level == spdlog::level::off) {
        LOG_WARN("Given invalid log level {}", log_level);
    } else {
        loggerPtr->set_level(level);
        loggerPtr->flush_on(level);
        //定时flush到文件，每三秒刷新一次
        spdlog::flush_every(std::chrono::seconds(1));
        spdlog::register_logger(loggerPtr);
    }
}

void Logger::UnInit(){
    spdlog::drop_all();
    spdlog::shutdown();
}
